import java.util.HashMap;

import _Banque.*;
import _Tests.Tests;
import _Utils.Data;
import _Exception.*;

/**
 * Operations bancaire du 13/12/11
 * @author V. Loïc
 */
public class TV_Banque_13
{
	public static void main(String[] args) throws Exception
	{
		Tests.Begin("Validation de la banque", "1.1.0");
		
		Tests.Design("Operations bancaires du 13/12/11", 3);
		
		Tests.Case("Operations du jour");
		{
			// --- on recupere la banque de la veille et les titulaires
			Banque banque = (Banque) Data.load("banque_12", "1.1.0");
			HashMap<String, Titulaire> titulaires = (HashMap<String, Titulaire>) Data.load("titulaires", "1.1.0");
			AgenceBancaire agenceNice = banque.getAgence(1001);
			
			// --- verification des statistiques
			Tests.Unit(989393.1875, banque.totalDepots());
			Tests.Unit(9, banque.nombreOperations("2011/12/12"));

			// --- operations de valentin
			Titulaire val = titulaires.get("valentin");
			CompteCourant ccVal = (CompteCourant) agenceNice.compteBancaire(8000002);
			try{
			    ccVal.executer("retrait n1", 'R', 100);
			} catch (Exception e) {
			    Tests.Unit(new BUException("retrait impossible : solde insuffisant"), e);
			}
			ccVal.executer("versement v2", 'V', 4002);
			ccVal.executer("versement v3", 'V', 1000000);

			// --- verification des statistiques
			Tests.Unit(1993395.25, banque.totalDepots());
			Tests.Unit(2, banque.nombreOperations(_Banque.dateCourante()));
			Tests.Unit(1004044, ccVal.getSoldeCompte());
			Tests.Unit(3, ccVal.getNombreOperations());

			// --- quentin ouvre un compte dans une nouvelle agence et fait des operations
			banque.ouvrirAgence("PACA", "Juan les Pins");
			AgenceBancaire agenceJuans = banque.getAgence(1002);	
			Titulaire quentin = titulaires.get("quentin");
			long buffer = agenceJuans.ouvrirCompte(quentin);
			
			CompteCourant ccQuentin = (CompteCourant) agenceJuans.compteBancaire(buffer);
			CompteEpargne ceQuentin = (CompteEpargne) agenceNice.compteBancaire(4000002);

			ceQuentin.executer("virement vers Juan les Pins", 'R', 2.37f);
			ccQuentin.executer("versement depuis compte epargne de Nice", 'V', 2.37f);

            buffer = agenceNice.ouvrirCompte(quentin, 1.f);
            ceQuentin = (CompteEpargne) agenceNice.compteBancaire(buffer);
            ceQuentin.executer("ajout 1centime au CE de Nice", 'V', 0.01f);

            
            // --- operations de Anthony
            Titulaire antho = titulaires.get("anthony");
            buffer = agenceNice.ouvrirCompte(antho);
            CompteCourant ccAntho = (CompteCourant) agenceNice.compteBancaire(buffer);
            ccAntho.executer("Versement init", 'V', 10);
            ccAntho.executer("Ajoute 2000", 'V', 2000);
            
			
			// --- modou
			CompteEpargne ceModou = (CompteEpargne) agenceNice.compteBancaire(4000001);
			ceModou.executer("retrait", 'R', 50.f);
			
			// --- lorris
			Titulaire lolo = titulaires.get("lorris");
			buffer = agenceNice.ouvrirCompte(lolo);

            // --- lucas
            Titulaire lucas = titulaires.get("lucas");
            buffer = agenceNice.ouvrirCompte(lucas, 1.f);
            CompteEpargne ceLucas = (CompteEpargne) agenceNice.compteBancaire(buffer);
            ceLucas.executer("v1", 'V', 2439.96f);

            // --- thomas
            Titulaire toto = titulaires.get("thomas");
            buffer = agenceNice.ouvrirCompte(toto, 1.f);
            CompteEpargne ceToto = (CompteEpargne) agenceNice.compteBancaire(buffer);
            ceToto.executer("v1", 'V', 1500.f);
            ceToto.executer("v2", 'V', 356.35f);

            // --- kevin S
            Titulaire kevin = titulaires.get("kevinS");
            buffer = agenceNice.ouvrirCompte(kevin, 1.f);
            CompteEpargne ceKevin = (CompteEpargne) agenceNice.compteBancaire(buffer);
            ceKevin.executer("v1", 'V', 1000.58f);

			// --- verification des statistiques
			Tests.Unit(2000651.75, banque.totalDepots());
			Tests.Unit(12, banque.nombreOperations(_Banque.dateCourante()));
			

			// --- enregistrement de la banque et des titulaires
			//Tests.Unit(true, Data.store(banque, "banque_13", "1.1.0"));
			//Tests.Unit(true, Data.store(titulaires, "titulaires", "1.1.0"));
		}
		
		
		Tests.End();
	}

}
